﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Datos.Entidades;
using Datos.Fabricas;
using Datos.Interfaces;
using System.Data.SqlClient;
using Datos.Entidades.FabricaEntidades;
using log4net;

namespace Datos.DAOSqlServer
{
    public class DAOSqlServerAccesoCategoria : IDAOAccesoCategoria
    {
        #region Logger
        private static readonly ILog log = LogManager.GetLogger(
        System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);





        #endregion  
        
       IDAOAccesoConexion bd = FabricaConexion.DAOSqlServerAccesoConexion();

       public DAOSqlServerAccesoCategoria()
       {
           log.Info("Conexion DAOSqlAccesoCategorira");
       }


        /// <summary>
        /// Inserta una nueva categoria en la base de datos
        /// </summary>
        /// <param name="categoria">Categoria a insertar</param>
        /// <returns>Si la creación fue exitosa o no</returns>
        public bool InsertarCategoria(Entidad categoria)
       {
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[INSCategoria]";
               command.CommandTimeout = 10;
               command.Parameters.AddWithValue("@Id", (categoria as Categoria).Id_Categoria);
               command.Parameters.AddWithValue( "@Nombre",(categoria as Categoria).NombreCategoria );
               command.Parameters.AddWithValue( "@Tipo",(categoria as Categoria).TipoCategoria );
               

               SqlDataReader reader = command.ExecuteReader();
               log.Info("Se genero la consulta");
               reader.Close();
               bd.CerrarConexionBd();
               return true;
              

           } catch ( SqlException )
           {
               log.Error("No se genero la consulta");
               bd.CerrarConexionBd();
               return false;
           } catch ( Exception )
           {
               log.Error("Error en la aplicacion");

               bd.CerrarConexionBd();
               return false;
           }
       }
    



     /// <summary>
        /// Eliminar categoria en la base de datos
        /// </summary>
        /// <param name="categoria">ID Categoria a eliminar</param>
        /// <returns>Si la eliminacion fue exitosa o no</returns>
        public bool EliminarCategoria(int idCategoria)
       {
           SqlCommand command = new SqlCommand();
           try
           {
               bd.AbrirConexionBd();
               command.Connection = bd.ObjetoConexion();
               command.CommandType = System.Data.CommandType.StoredProcedure;
               command.CommandText = "[dbo].[DELCategoria]";
               command.CommandTimeout = 10;

               command.Parameters.AddWithValue( "@IdCategoria",idCategoria );
              
               SqlDataReader reader = command.ExecuteReader();

               reader.Close();
               bd.CerrarConexionBd();
               log.Info("Se genero la consulta");
               return true;
           } catch ( SqlException )
           {
               log.Error("No se genero la consulta");
               bd.CerrarConexionBd();
               return false;
           } catch ( Exception )
           {
               log.Error("Error en la aplicacion");
               bd.CerrarConexionBd();
               return false;
           }
       }

        public List<Entidad> ObtenerCategoria()
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELFCategoria]";
                command.CommandTimeout = 10;

                List <Entidad> listaCategoria=new List<Entidad>();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Entidad categoria = FabricaEntidades.ObtenerCategoria();
                    (categoria as Categoria).Id_Categoria = (reader.GetInt32(0));
                    (categoria as Categoria).NombreCategoria = (reader["NombreCategoria"] as String);
                    (categoria as Categoria).TipoCategoria = (reader.GetInt32(2));
                    (categoria as Categoria).Status = (reader.GetInt32(3));
                    
                    listaCategoria.Add((categoria as Categoria));
                }
                log.Info("Se genero la consulta");
                reader.Close();
                bd.CerrarConexionBd();
                return listaCategoria;
            }
            catch (SqlException)
            {
                log.Error("No se genero la consulta");
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");
                bd.CerrarConexionBd();
                return null;
            }
        }

        /// <summary>
        /// Modificar ucategoria en la base de datos
        /// </summary>
        /// <param name="categoria">Categoria a Modificar</param>
        /// <returns>Si la modificaion fue exitosa o no</returns>
        public bool ModificarCategoria(Entidad categoria)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[UPDCategoria]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@Status", (categoria as Categoria).Status);
                command.Parameters.AddWithValue("@Nombre", (categoria as Categoria).NombreCategoria);
                command.Parameters.AddWithValue("@IdCategoria", (categoria as Categoria).Id_Categoria);
                command.Parameters.AddWithValue("@Tipo", (categoria as Categoria).TipoCategoria);


                SqlDataReader reader = command.ExecuteReader();
                log.Info("Se genero el Update");
                reader.Close();
                bd.CerrarConexionBd();
                return true;


            }
            catch (SqlException)
            {
                log.Error("No se generoel Update");
                bd.CerrarConexionBd();
                return false;
            }
            catch (Exception)
            {
                log.Error("Error en la aplicacion");

                bd.CerrarConexionBd();
                return false;
            }
        }

        /// <summary>
        /// Obtener categoria en la base de datos
        /// </summary>
        /// <param name="idCategoria">Categoria a Obtener</param>
        /// <returns>Si el select fue exitosa o no</returns>
        public Entidad BuscarCategoria(int idCategoria)
        {
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELCategoria]";
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@IdCategoria", idCategoria);

                Entidad categoria = FabricaEntidades.ObtenerCategoria();
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                
                    (categoria as Categoria).Id_Categoria = (reader.GetInt32(0));
                    (categoria as Categoria).NombreCategoria = (reader["NombreCategoria"] as String);
                    (categoria as Categoria).TipoCategoria = (reader.GetInt32(2));
                    (categoria as Categoria).Status = (reader.GetInt32(3));

                    
                }

                reader.Close();
                bd.CerrarConexionBd();
                return categoria;
            }
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }
            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }

    }

}
